
#include  "stm32f0xx.h"
#include "bsp_usart.h"
#include "bsp_voice.h"

u8 u2RcvBuf[U2RCV_MAXLEN];
u32 ulRcvCont =0;
u8 u2RcvOverFlag=0;

//USART初始化函数(使用USART点灯的过程中不用中断)
void	USART2_Config(u32 baud)
{
    GPIO_InitTypeDef	GPIO_InitStruct;
    USART_InitTypeDef	USART_InitStruct;
	  NVIC_InitTypeDef NVIC_InitStruct;     					//初始化NVIC结构体

    //开启相关外设的时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);    			//开启USART1的时钟
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);   //开启GPIO的时钟

	
    /*
    PA9-TX-推挽复用
    PA10-RX-浮空输入/上拉输入
    */
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_1);
    GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_1);
    //配置USART的相应管脚的模式
    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;          //Tx管脚
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_2;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_Level_3;
    GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
    GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;   
    GPIO_Init(GPIOA,&GPIO_InitStruct);

    GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;          //Rx管脚
    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_3;
    GPIO_InitStruct.GPIO_Speed=GPIO_Speed_Level_3;
    GPIO_InitStruct.GPIO_OType=GPIO_OType_PP;
    GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;   
    GPIO_Init(GPIOA,&GPIO_InitStruct);

    //配置串口的工作参数   即波特率=115200   数据长度=8bit    停止位=1bit   校验位=无  硬件流控制=无
    USART_InitStruct.USART_BaudRate=baud;
    USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
    USART_InitStruct.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;     //配置模式(收发一起)
    USART_InitStruct.USART_Parity=USART_Parity_No ;
    USART_InitStruct.USART_StopBits=USART_StopBits_1;
    USART_InitStruct.USART_WordLength=USART_WordLength_8b;

    USART_Init(USART2,&USART_InitStruct);                 //DEBUG_USARTx一个结构体指针
    

     NVIC_InitStruct.NVIC_IRQChannel=USART2_IRQn;    	//中断号
     NVIC_InitStruct.NVIC_IRQChannelPriority=2;              //抢占优先级1级
     NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;             //使能中断
     NVIC_Init(&NVIC_InitStruct );                         //执行初始化

    //选择具体的USART中断类型  (这个可靠吗???)
    USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);  //空闲中断 (有好几个中断,都可引起USART中断)
    //使能USART
    USART_Cmd(USART2,ENABLE);
}




void u2SendByte(int ch)
{
		USART_SendData(USART2,(uint8_t)ch);
    while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);  //等待发送完成

}

void u2SendString(u8 *bf)
{
	while(*bf=='\0')
	{
		u2SendByte(*bf);
		bf++;
	}
}


////下面得重写一些标准的C库函数(需要重写前面包含stdio.h吗)

////重定向c库函数printf到串口，重定向后可使用printf函数
int	fputc(int ch,FILE *f)    //这里的FILE *f其实没什么屌用
{
		USART_SendData(USART2,(uint8_t)ch);
    while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);  //等待发送完成
    return	ch;   //按标准返回
	
}

////重定向c库函数scanf到串口,重定向后可使用scanf,getchar等函数
//int	fgetc(FILE	*f)
//{   //这里是不用中断的
//    while(USART_GetFlagStatus(USART2,USART_FLAG_RXNE)==RESET);
//    return USART_ReceiveData(USART2);
//}




void USART2_IRQHandler()
{
	uint8_t dat;
	if(USART_GetFlagStatus(USART2, USART_FLAG_ORE) != RESET)//没有这个会卡死在中断,数据益处中断
	{
			dat = USART_ReceiveData(USART2);
			USART_ClearFlag(USART2, USART_FLAG_ORE);
	}

	if(USART_GetITStatus(USART2,USART_IT_RXNE))
	{
		dat = USART_ReceiveData(USART2);
		
		u2RcvBuf[ulRcvCont++] = dat;
		if(ulRcvCont == 6)
		{
			u2RcvOverFlag=1;
			ulRcvCont=0;
			voicePoint = voiceCheke(u2RcvBuf[4],u2RcvBuf[5]);

		}
		
		
		
//		if(!u2RcvOverFlag)
//		{
//			if(ulRcvCont==0x0d)
//			{
//				ulRcvCont=0;
//				u2RcvOverFlag=1;	
//			}else
//			{
//				u2RcvBuf[ulRcvCont++] = dat;
//			}
//		}

	}

}
